package com.sun.huazhi.aitaskservice.common.client;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 基础 Python API 客户端，抽象公共配置和文件操作
 */
public class BasePythonApiClient {

    protected final WebClient webClient;
    protected final Path tempDir; // 各子类独立子目录

    /**
     * 父类构造函数 - 统一初始化 WebClient 和临时目录
     * @param baseUrl        Python 服务基础 URL（由子类通过 @Value 注入）
     * @param apiKey         API 认证密钥
     * @param baseTempDir    临时文件基础目录（如配置的临时目录根路径）
     * @param serviceSubDir  服务专属子目录（如 "videos", "images"）
     * @throws IOException 目录创建失败时抛出
     */
    protected BasePythonApiClient(
            String baseUrl,
            String apiKey,
            String baseTempDir,
            String serviceSubDir) throws IOException {
        // 初始化 WebClient
        this.webClient = WebClient.builder()
                .baseUrl(baseUrl)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader("X-API-Key", apiKey)
                .build();

        // 创建服务专属临时目录（如 /tmp/aitask/videos）
        Path basePath = Paths.get(baseTempDir, "aitask");
        this.tempDir = createServiceTempDir(basePath, serviceSubDir);
    }

    /**
     * 创建服务专属临时目录
     */
    private Path createServiceTempDir(Path basePath, String subDir) throws IOException {
        Path serviceDir = basePath.resolve(subDir);
        if (!Files.exists(serviceDir)) {
            Files.createDirectories(serviceDir); // 递归创建目录
        }
        return serviceDir;
    }

    /**
     * 公共方法：保存资源到临时文件
     */
    protected Mono<File> saveResourceToTemp(Resource resource, String filename) {
        return Mono.fromCallable(() -> {
            Path targetPath = tempDir.resolve(filename);
            Files.copy(resource.getInputStream(), targetPath);
            return targetPath.toFile();
        }).onErrorMap(IOException.class, e ->
                new RuntimeException("文件保存失败: " + e.getMessage(), e)
        );
    }
}

